#include <iostream>
#include "ProcesadorTextos.h"

using namespace std;

ProcesadorTextos::ProcesadorTextos(Lista<Autor*>* autores) {
	this->autores = autores;
	this->delimitadores = " ,;.:\n\r\t\f";
}

ProcesadorTextos::~ProcesadorTextos() {
	delete autores;
}

void ProcesadorTextos::setListaPrincipal(ListaPrincipal* listaPrincipal){
	this->listaPrincipal = listaPrincipal;
}

ListaPrincipal* ProcesadorTextos::getListaPrincipal(){
	return this->listaPrincipal;
}

void ProcesadorTextos::procesarListas(const string &path) {

	ArchivoTexto archivoPrincipal(path);
	archivoPrincipal.irAlPrincipio();

	string parrafo;

	char *palabra;
	char *nombre_autor;

	while(archivoPrincipal.leerLinea(parrafo)){

		char *buffer = new char[parrafo.size() + 1];
		strcpy(buffer,parrafo.c_str());

		nombre_autor = (char*)strtok(buffer, this->delimitadores.c_str());

		IteradorLista<Autor*> itAutores = this->autores->iterador();

		while (itAutores.tieneSiguiente()) {
			Autor* actual = itAutores.siguiente();

			if (nombre_autor == actual->getNombre()) {

				while ((palabra = strtok(0, delimitadores.c_str())) != NULL){
					actual->agregarPalabra(new Palabra(palabra));
					//cout << actual->getPalabras()->toString() << endl;
				}
				break;
			}
		}

		delete[] buffer;

	}
}

void ProcesadorTextos::procesarListaPrincipal() {

	Palabra* maximaFrecuencia = new Palabra("ninguna");
	maximaFrecuencia->setFrecuencia(0);

	IteradorLista<Autor*> itAutores = this->autores->iterador();

	itAutores.primero();

	while (itAutores.tieneSiguiente()) {

		Autor* actual = itAutores.siguiente();

		IteradorLista<Palabra*> iterador = actual->getPalabras()->getPalabras()->iterador();
		Palabra* aRemover;

		//carga las 20 palabras mas frecuentes de marx y weber
		for(int i=0 ; i < 20 ; i++){

			Palabra* maximaFrecuencia = new Palabra("ninguna");
			maximaFrecuencia->setFrecuencia(0);

			iterador.primero();// = actual->getPalabras()->getPalabras()->iterador();

			while(iterador.tieneSiguiente()){
				Palabra* pal = iterador.siguiente();
				if(pal->getFrecuencia() > maximaFrecuencia->getFrecuencia()){
					maximaFrecuencia->setValor(pal->getValor());
					maximaFrecuencia->setFrecuencia(pal->getFrecuencia());
					aRemover = pal;
				}
			}

			PalabraConFrecuencias* palFrec = new PalabraConFrecuencias(maximaFrecuencia->getValor());

			if(actual->getNombre() == "M")
				palFrec->setFrecuenciaMarx(maximaFrecuencia->getFrecuencia());
			else if(actual->getNombre() == "W")
				palFrec->setFrecuenciaWeber(maximaFrecuencia->getFrecuencia());

			this->listaPrincipal->agregarPalabra(palFrec);

			IteradorLista<Palabra*> iteradorParaEliminar = actual->getPalabras()->getPalabras()->buscar(aRemover);

			iteradorParaEliminar.remover();

			delete maximaFrecuencia;
		}

	}
}

void ProcesadorTextos::procesarFrecuenciasParciales(const string &path){

	ArchivoTexto archivoPrincipal(path);
	archivoPrincipal.irAlPrincipio();

	string parrafo;

	char *palabra;
	char *nombre_autor;

	while(archivoPrincipal.leerLinea(parrafo)){

		char *buffer = new char[parrafo.size() + 1];
		strcpy(buffer,parrafo.c_str());

		nombre_autor = (char*)strtok(buffer, delimitadores.c_str());

		//agrego toda la linea en 0
		IteradorLista<PalabraConFrecuencias*> itLista = this->listaPrincipal->getLista()->iterador();

		while (itLista.tieneSiguiente()) {
			itLista.siguiente()->getListaFrecuencias()->agregar(new FrecuenciaParrafo(nombre_autor)); //al final
		}

		while ((palabra = strtok(0, this->delimitadores.c_str())) != NULL){
			itLista.primero();

			while (itLista.tieneSiguiente()) {

				PalabraConFrecuencias* actual = itLista.siguiente();
				if(actual->getPalabra() == palabra){

					IteradorLista<FrecuenciaParrafo*> itFrecuenciasParrafos = actual->getListaFrecuencias()->iterador();
					itFrecuenciasParrafos.ultimo();
					FrecuenciaParrafo* frecParr = itFrecuenciasParrafos.get();

					frecParr->aumentarContador();
				}

			}

		}

		delete[] buffer;
	}
}

Lista<Autor*>* ProcesadorTextos::getAutores() {
	return this->autores;
}
